package br.org.alexegidio.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;

import org.richfaces.component.UIDataTable;

import br.org.alexegidio.jsf.FacesUtil;
import br.org.alexegidio.jsf.PagedListDataModel;
import br.org.alexegidio.model.Situacao;
import br.org.alexegidio.persistence.GenericDAOImpl;

/**
 * 
 * @author alexegidio@yahoo.com.br
 * @since 17/10/2010
 */
public class SituacaoBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Situacao situacao;
	private String idEntity;
	private final GenericDAOImpl<Situacao> situacaoDAO;
	private List<Situacao> list;
	private Integer paginaAtual;

	public SituacaoBean() {
		super();
		situacao = new Situacao();
		situacaoDAO = new GenericDAOImpl<Situacao>(Situacao.class);
	}

	public Situacao getSituacao() {
		return situacao;
	}

	public void setSituacao(Situacao situacao) {
		this.situacao = situacao;
	}

	public List<Situacao> getList() {
		if (list == null) {
			list = new ArrayList<Situacao>();
		}
		return list;
	}

	public void setList(List<Situacao> list) {
		this.list = list;
	}

	public String getIdEntity() {
		return idEntity;
	}

	public void setIdEntity(String idEntity) {
		this.idEntity = idEntity;
	}

	public Integer getPaginaAtual() {
		if (paginaAtual == null) {
			paginaAtual = new Integer(0);
		}
		return paginaAtual;
	}

	public void setPaginaAtual(Integer paginaAtual) {
		this.paginaAtual = paginaAtual;
	}

	// *****Fim dos Getters and Setters *****///

	public void save() {
		try {
			situacaoDAO.save(getSituacao());
			listAll();
			FacesUtil.getInstance().sendMessageInfo(
					"Registro salvo com sucesso.");
		} catch (Exception e) {
			e.printStackTrace();
			FacesUtil.getInstance().sendMessageError(
					"Erro ao salvar o registro." + e);
		}
		situacao = new Situacao();
	}

	public void delete() {
		situacaoDAO.delete(situacao);
	}

	public void listAll() {
		list = situacaoDAO.listAll();
	}

	public Situacao load(Long id) {
		return situacaoDAO.load(id);
	}

	public Situacao find(Long id) {
		return situacaoDAO.find(id);
	}

	/**
	 * prepara o form para atualizacao enviando buscando o id e setando para o
	 * formulário padrão
	 */
	public void prepareUpdate() {
		Long id = Long.parseLong(getIdEntity());
		if (id != null) {
			setSituacao(find(id));
		}
	}

	public List<SelectItem> getSituacaoSelect() {
		List<SelectItem> list = new ArrayList<SelectItem>();
		List<Situacao> Situacoes = situacaoDAO.listAll();
		for (Situacao r : Situacoes) {
			list.add(new SelectItem(r, r.toString()));
		}
		return list;
	}

	// TODO definir um local para configurar o número de resultados por página
	public List<Situacao> getPaginatedList(int paginaAtual) {
		int resultPerPage = 10;

		// Matemática simples para calcular a página a ser exibida ;)
		paginaAtual = (paginaAtual * resultPerPage) - resultPerPage;

		return situacaoDAO.listPaginated(resultPerPage, paginaAtual, "id");
	}

	public DataModel getListaPaginada() {
		int totalListSize = getSituacaoSelect().size();
		List<Situacao> pagedList = getPaginatedList(getPaginaAtual());
		PagedListDataModel dataModel = new PagedListDataModel(pagedList,
				totalListSize, getTable1().getRows());
		return dataModel;
	}

	private UIDataTable getTable1() {
		UIComponent component = null;

		FacesContext facesContext = FacesContext.getCurrentInstance();
		if (facesContext != null) {
			UIComponent root = facesContext.getViewRoot();
			FacesUtil.getInstance();
			component = FacesUtil.getInstance().findComponent(root, "table");
		}

		return (UIDataTable) component;
	}

}
